#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <string.h>

// void writer(int fd)
// {
//     int i = 0;
//     char buf[1024];
//     while (1)
//     {
//         snprintf(buf, sizeof(buf), "message:hello %d", ++i);

//         printf("write::count:%d\n", i);
//         write(fd, buf, strlen(buf));
//     }
// }
// void reader(int fd)
// {
//     char buf[1024];
//     while (1)
//     {
//         sleep(3);
//         read(fd, buf, sizeof(buf) - 1);
//         printf("read:: %s\n", buf);
//     }
// }

// void writer(int fd)
// {
//     int i = 0;
//     char c = 'M';
//     while (1)
//     {
//         write(fd, &c, 1);
//         printf("write::count:%d\n", ++i);
//         if (i > 66600)
//             break;
//     }
// }
// void reader(int fd)
// {
//     char buf[1024];
//     while (1)
//     {
//         sleep(3);
//         read(fd, buf, 512);
//         printf("read:: %s\n", buf);
//     }
// }

// void writer(int fd)
// {
//     int i = 0;
//     char c = 'M';
//     while (1)
//     {
//         write(fd, &c, 1);
//         printf("write::count:%d\n", ++i);
//         if (i >= 7)
//             break;
//     }
//     close(fd);
// }
// void reader(int fd)
// {
//     char buf[1024];
//     while (1)
//     {
//         sleep(1);
//         ssize_t n = read(fd, buf, 3);

//         if (n > 0)
//             printf("read::%d,%s\n", n, buf);
//         else
//             break;
//     }
// }

void writer(int fd)
{
    int i = 0;
    char c = 'M';
    while (1)
    {
        sleep(1);
        write(fd, &c, 1);
        printf("write::count:%d\n", ++i);
    }
}
void reader(int fd)
{
    sleep(3);
    char buf[1024];
    read(fd, buf, 5);

    close(fd);
}

// int main()
// {
//     int pipefd[2];
//     int n = pipe(pipefd);
//     if (n < 0)
//         return 1;

//     pid_t id = fork();

//     if (id == 0)
//     {
//         close(pipefd[0]); // 关掉读端
//         writer(pipefd[1]);

//         exit(0);
//     }

//     close(pipefd[1]); // 关掉写端
//     reader(pipefd[0]);

//     int status = 0;
//     waitpid(id, &status, 0);
//     printf("status:%d\n", status);

//     return 0;
// }

int main()
{
    int pipefd[2];
    pipe(pipefd);

    pid_t id = fork();

    if (id == 0)
    {
        close(pipefd[0]); // 关掉读端
        sleep(3);
        write(pipefd[1], "h", 1); // 此时管道的所有读端都关闭了，然后再写入，会收到信号

        while (1)
            ;
        exit(0);
    }

    close(pipefd[1]); // 关掉写端
    close(pipefd[0]);

    printf("man!!\n");

    int status = 0;
    waitpid(id, &status, 0);
    printf("status:%d\n", status);

    return 0;
}